package com.fzebu.fastboot.util;

import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;

import java.math.BigDecimal;

/**
 * @author: jack
 * @create: 2020/1/2 15:18
 * @version: 1.0.0
 **/
public class MathUtil {

    private static final String ZERO = "0.0";

    // 除法运算默认精度
    private static final int DEF_DIV_SCALE = 10;

    public static double add(String ... values) {
        return addition(values).doubleValue();
    }

    public static double sub(String v1, String ... values) {
        return subtract(v1, values).doubleValue();
    }

    public static double mul(String ... values) {
        return multiply(values).doubleValue();
    }

    public static double div(String v, String ... values) {
        return divide(v, values).doubleValue();
    }

    public static int compareTo(String v1, String v2) {
        if (StringUtils.isEmpty(v1)) {
            v1 = ZERO;
        }
        if (StringUtils.isEmpty(v2)) {
            v2 = ZERO;
        }
        return new BigDecimal(v1).compareTo(new BigDecimal(v2));
    }

    public static BigDecimal addition(String ... values) {
        if (ArrayUtils.isEmpty(values)) {
            return BigDecimal.ZERO;
        }
        BigDecimal total = new BigDecimal(ZERO);
        for (String value : values) {
            if (StringUtils.isEmpty(value)) {
                continue;
            }
            total = total.add(new BigDecimal(value));
        }
        return total;
    }

    public static BigDecimal subtract(String v1, String ... values) {
        if (ArrayUtils.isEmpty(values)) {
            return new BigDecimal(v1);
        }
        if (StringUtils.isEmpty(v1)) {
            v1 = ZERO;
        }
        BigDecimal res = new BigDecimal(v1);
        for (String value : values) {
            if (StringUtils.isEmpty(value)) {
                continue;
            }
            res = res.subtract(new BigDecimal(value));
        }
        return res;
    }

    public static BigDecimal multiply(String ... values) {
        if (ArrayUtils.isEmpty(values)) {
            return BigDecimal.ZERO;
        }
        BigDecimal total = new BigDecimal(1);
        for (String value : values) {
            if (StringUtils.isEmpty(value)) {
                continue;
            }
            total = total.multiply(new BigDecimal(value));
        }
        return total;
    }

    public static BigDecimal divide(String v, String ... values) {
        if (ArrayUtils.isEmpty(values)) {
            return BigDecimal.ZERO;
        }
        BigDecimal total = new BigDecimal(v);
        for (String value : values) {
            if (StringUtils.isEmpty(value)) {
                continue;
            }
            total = total.divide(new BigDecimal(value), DEF_DIV_SCALE, BigDecimal.ROUND_HALF_UP);
        }
        return total;
    }

    public static BigDecimal divide(String v1, String v2) {
        return divide(v1, v2, DEF_DIV_SCALE);
    }

    public static BigDecimal divide(String v1, String v2, int scale) {
        if (scale < 0) {
            throw new IllegalArgumentException("The scale must be a positive integer or zero");
        }
        return new BigDecimal(v1).divide(new BigDecimal(v2), scale, BigDecimal.ROUND_HALF_UP);
    }
}